let a = String('abc')
console.log
  (a.__proto__ === String.prototype)




// 一道面试题 new一个对象的过程
function Perent(val) {
  this.name = val
  // return this
}

let son = new Perent('jiffy')
console.log(son.name)



// 1 创建一个新对象 
//     son
// 2 新对象会被执行[[prototype]]连接 
//     son.__proto__ = Perent.prototype 指向Object
// 3 新对象和函数调用的this会绑定起来 
//     Perent.call(son,"jiffy")
// 4 执行构造函数中代码 
//     son.name
// 5 如果函数没有返回值，会自动返回这个新对象 前提是有new关键字
//     return this



// new关键字使用构造函数实例化对象
// 那么不使用new关键字呢 只是当作普通函数使用 此时this指向window
// JS中内置了一些构造函数，这些构造函数不使用new也能得到实例对象 称为安全类
let girl = Perent('lucy')
console.log(girl.name);  // TypeError: Cannot read property 'name' of undefined 
// 由于构造函数没有返回值 所以girl是undefined，'lucy'可以通过window.name 访问


// 安全类
var arr = []
var arr = new Array()
var arr = Array()



// 安全工厂|安全类      
// 对不安全的构造函数进行改造
function Perent(val) {
  if (this === window) {
    return new Perent(val)
  } else {
    this.name = val
  }
}